package second00001;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.Person;

import java.util.Map;

/**
 * @author: ZhouBert
 * @date: 2020/7/24
 * @description:	测试
 * Spring Ioc 最核心的引用 =》 Spring-context
 * 配置文件说明：
 * 1.配置文件放置位置：任意位置，没有硬性要求；
 * 2.配置文件的命名：建议-applicationContext.xml，没有硬性要求；
 * （IDEA 便捷创建 Spring Config File : resources右键-New-XML Configuration File-Spring config）
 * ------
 * Spring 使用步骤
 * 1.创建类型；eg.User.class
 * 2.配置文件的配置 applicationContext.xml
 * 3.通过工厂类，获得对象
 * ApplicationContext
 * 	\- ClassPathXmlApplicationContext
 * 	\-
 * 	------
 * 	研究一下 Spring 常用方法
 * 	1.
 */
@Slf4j
public class TestApp4GetBeans {

	ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");

	/**
	 * 直接通过 getBean(beans id ) 的方式
	 */
	public void testGetBean1(){
		Person person = (Person) context.getBean("person");
		log.info(person.toString());
	}

	/**
	 * 通过 getBean(beans id ,class) 的方式,避免了类型的强制转换
	 */
	public void testGetBean21(){
		Person person = context.getBean("person", Person.class);
		log.info(person.toString());
	}

	/**
	 * 通过 getBean(class) 的方式，也可以获取 beans 并且避免类型强转！
	 * 但是存在一个问题：beans 中存在同样的类型，就会造成异常！
	 */
	public void testGetBean22(){
		Person person = context.getBean(Person.class);
		log.info(person.toString());
	}

	/**
	 * 通过获取 定义的beans 拿到数组
	 * beans id 的数组
	 */
	public void testGetBean3_DifinedNames(){
		String[] beanDefinitionNames = context.getBeanDefinitionNames();
		for (String name :
				beanDefinitionNames) {
			log.info(name);
		}
	}

	/**
	 * 根据类型获取 【某个类型的bean】
	 *
	 */
	public void testGetBean4_ForType(){
		Map<String, Person> beansOfType = context.getBeansOfType(Person.class);
		beansOfType.forEach((k,v)->log.info("{},{}",k,v));
	}

	/**
	 * 判断 beans id 是否存在于工厂之中
	 * context.containsBean
	 */
	public void testGetBean5_ContainsBeanDefinition(){
		String beanId = "name";
		if (context.containsBeanDefinition(beanId)) {
			log.info("contains beans id {}", beanId);
		}else {
			log.info("not contains beans id {}", beanId);
		}

	}




	public static void main(String[] args) {
		TestApp4GetBeans testApp = new TestApp4GetBeans();
		testApp.testGetBean1();
		log.info("------------------------------------------------------");
		testApp.testGetBean21();
		log.info("------------------------------------------------------");
		//testApp.testGetBean22();
		log.info("------------------------------------------------------");
		testApp.testGetBean3_DifinedNames();
		log.info("------------------------------------------------------");
		testApp.testGetBean4_ForType();
	}
}
